package com.shujia.base.day04

import scala.io.{BufferedSource, Source}
import scala.language.implicitConversions

/**
 * 隐式转换
 * 本意其实就是将一个类型转成另一个类型进行使用
 *
 * 隐式转换，在scala中有三种形式：
 * 隐式转换函数，隐式转换类，隐式转换变量
 *
 * scala提供了一个关键字：implicit，表示隐式转换
 *
 *
 */
object Demo27Implicit {
  def main(args: Array[String]): Unit = {
    //显示转换
    //需求：将一个字符串1000转成数值1000
    //    def fun1(s: String): Int = s.toInt
    //
    //    val n1: Int = fun1("1000")

    //    def show1(i: Int): Int = {
    //      i + 11
    //    }
    //
    //    implicit def fun1(s: String): Int = Integer.parseInt(s)
    //
    //    //调用show1函数，需要传入一个Int类型的元素
    //    println(show1(100))
    //    println(show1(200))
    //    //当调用show1函数时，需要一个Int类型，但是我们传入的是字符串，scala会先在当前的object中查找隐式转换
    //    //发现上面有一个隐式转换函数，这个函数的类型就是String=>Int
    //    //会自动地的调用该隐式转换函数，按照隐式转换的逻辑将字符串转成Int类型
    //    println(show1("300"))
    //    val studentsList: List[String] = Source.fromFile("scala/data/students.txt").getLines().toList
    //    val scoreList: List[String] = Source.fromFile("scala/data/score.txt").getLines().toList

    //写一个隐式转换函数
    //    implicit def fun2(path:String):BufferedSource={
    //      Source.fromFile(path)
    //    }
    //    "scala/data/students.txt".getLines()

    //    implicit def fun3(path:String):List[String]={
    //      Source.fromFile(path).getLines().toList
    //    }
    //
    //    //这里字符串调用的foreach函数，在String类中已经存在了
    //    //我们想的是应该去调用隐式转换将字符串转成List[String]然后再foreach
    //    //但是实际上报错了
    //    def show1(list: List[String]): Unit = {
    //      list.foreach(println)
    //    }

    /**
     * 我们以后更多的将隐式转换函数写在一个object对象中，在其他的程序中引入这些隐式转换
     */
    import com.shujia.base.day04.Test1._
    //    show1("scala/data/students.txt")

    println("1000" + 100) // 1000100

    println("1000" - 100)


  }
}

object Test1 {
  implicit def fun3(path: String): List[String] = {
    Source.fromFile(path).getLines().toList
  }

  implicit def fun4(s: String): Int = {
    Integer.parseInt(s)
  }
}
